/*
 * Copyright (c) 2024 - 2025 Midea Company of Midea Group.
 *
 * File Name 	    : ui_base_page.h
 * Description	    : 界面管理器
 * Author			: huocy
 * Date	            : 2024/04/12
 * History	        : 
 */

#ifndef __UI_BASE_PAGE_H__
#define __UI_BASE_PAGE_H__

#include "../page_manager/page_manager.h"
#include "lvgl.h"

#ifdef __cplusplus
extern "C" 
{

#endif

/**
 * @brief 第一步初始化页面管理
 * @param manager_name 管理器标识
 */
void page_init(char *manager_name);
/**
 * @brief 第二步安装对应页面到页面池
 * @param name  页面标识
 * @param pagev 页面生命周期虚表
 */
void page_install(const char *name, page_vtable_t *pagev,void* priv_data);
void page_uninstall(const char *name);
void page_satck_clear(bool keep_bottom);
/**
 * @brief 第三步push对应页面进栈容器池，显示
 * @param name 页面标识
 */
void page_push(const char *name);

/**
 * @brief 第三步push对应页面进栈容器池，显示
 * @param name 页面标识
 * @param stash parameter 
 */
void page_push_with_stash(const char *name, const page_stash_t *stash);
/**
 * @brief pop应页面出栈容器池，退出显示
 */
void page_pop(void);
void page_pop_anim(page_load_anim_t anim);
/**
 * @brief install和push和pop快捷共享操作接口
 * @param name  页面标识
 * @param pagev 页面生命周期虚表.push操作时需要，其他可为NULL
 * @note 第一步页面池中不存在，自动install注册。第二步栈容器池中如已存在执行poptopage,反之push
 */
void page_view(const char *page_name, page_vtable_t *pagev);

/**
 * @brief push对应页面进栈容器池带完成回调，显示
 * @param name install的页面名称
 * @param complete push完成回调
 */
void page_push_complete(const char *name, view_navigator_finsh complete);

/**
 * @brief 新page_name页面显示,并将stack容器中栈底到page_name之间的页面删除
 * @param page_name 页面名称
 * @note page_name为根页面
 */
void page_switch_new_root(const char *page_name);
/**
 * pop出栈 直到只有一个页面在stack中。即销毁statck中其他的页面，pop回根页面显示
 */
void page_popToRoot(void);
/**
 * @brief pop出栈，直到指定的页面在栈顶。
 * @param page_name 页面标识
 * @note 销毁stack容器中，栈顶到page_name之间的页面，pop到page_name页面显示。
 */
void page_popToPage(char *page_name);
/**
 * @brief 从栈容器中清除指定page，包括page_pool和stack_pool中的对应元素。
 * @param page_name 页面标识
 * @note page_name不可为当前栈顶。
 */
void page_delete_page(char *page_name);

/**
 * @brief 删除页面管理器对象。清除包含page_pool和stack_pool中所有元素以及页面对象。
 * @param manager_name 管理器标识
 * @note 谨慎使用，需要新管理器中页面显示完成后可调用。可在push完成回调中使用。
 */
void page_delete_manager(char *manager_name);
/**
 * @brief 切换页面管理器
 * @param manager_name 管理器标识
 */
page_manager_t *page_switch_manager(char *manager_name);

/// 生命周期
/**
 * @brief 跳转前 自定义参数事件回调实现
 */
void on_base_custom_attr_config(page_base_t *self);
/**
 * @brief 页面 加载事件
 */
void on_base_view_load(page_base_t *self);
/**
 * @brief 页面加载完成事件
 */
void on_base_view_did_load(page_base_t *self);
/**
 * @brief 页面即将展示事件
 */
void on_base_view_will_appear(page_base_t *self);
/**
 * @brief 页面已经展示事件
 */
void on_base_view_did_appear(page_base_t *self);
/**
 * @brief 页面即将消失事件
 */
void on_base_view_will_disappear(page_base_t *self);
/**
 * @brief 页面消失完成事件
 */
void on_base_view_did_disappear(page_base_t *self);
/**
 * @brief 页面卸载完成事件
 */
void on_base_view_did_unload(page_base_t *self);

void page_pop_anim_name(page_load_anim_t anim,const char *name);

int page_is_runing_anim(void);

void page_push_anim(const char *name,page_load_anim_t anim);

#ifdef __cplusplus
}
#endif
#endif
